JavaServer Pages (JSP)
このページには、JSPが何であるか、どのようにして書くのかについての説明を記す予定です。
JSPとは
JSPは、HTTP GETリクエストを受け付けてHTML文書を返すようなサーブレットを、特別な文法で記述できるようにする仕組みです。 Webアプリケーションでは、ユーザのブラウザに返すHTML文書を、サーバ側のアプリケーションの状態によって変えるニーズがあります。これを簡単に実現できるようにするのがJSPです。
JSPの構文
JSPはHTMLのコードにJavaのコードを書き込むようなスタイルで記述します。
code:jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<% String string = "Hello, World!" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title><%= string %></title>
</head>
<body>
<h1><%= string %></h1>
</body>
</html>
<%と%>で囲んでいる部分をスクリプトレットと呼び、ここにJavaの式を記述すると、HTML文書を生成する過程で式を実行させることができます。
また<%のすぐ後ろに@や=といった記号が来ることがあります。これはスクリプトレットとは異なるもので、それぞれ次の意味を持ちます。
@: ディレクティブ。このJSPファイルについての設定を記述する。
=: HTML文書の生成時に、その式の評価結果をその場に出力する。つまりJavaの式の評価結果をHTML文書の中に書き込める。
これを踏まえると、上のJSPからは次のHTML文書が生成されることになります(title要素とh1要素の中身に注目してください)。
code:html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hello, World!</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
JSPの組み立て方
作成したい画面に含める内容が決まっていることを前提に記します。
初めに、画面をそのままHTML文書として表現します。
次に、HTML文書のうち、アプリケーションの状態によって変化する部分を洗い出します。
最後に、洗い出した部分について、スクリプトレットと、式の評価結果を出力するための構文を用いて書き直します。
JSPの実態はHTML文書を本文とするレスポンスを返すサーブレットです。Javaで書かれたサーブレットからJSPに処理を「回す」ことで、結果として、JSPが生成したHTML文書を本文とするレスポンスを返すことができます。
次のようなサービスメソッドを持ったサーブレットを作成してください。
code:java
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/example.jsp");
dispatcher.forward(request, response);
}
上の例の場合、JSPは/src/main/webapp/WEB-INF/example.jspとして作成してください。
補足: /src/main/webapp/以下に配置したファイルはHTTP GETリクエストによって取得できます。
例えばアプリケーションサーバにhttp://localhost:8080/context-pathでアクセスできる場合、/src/main/webapp/script.jsはhttp://localhost:8080/context-path/script.jsにGETリクエストを送信することで取得できます。
ただし/src/main/webapp/WEB-INF/以下に配置したファイルは、たとえhttp://localhost:8080/context-path/WEB-INF/example.htmlにGETリクエストを送信したとしても取得できません。
サーブレットはビジネスロジックの処理を呼び出し、その結果を返させることがあります。この場合、その結果をサーブレットからJSPに共有する必要があります。 例えばあるモデルオブジェクトの詳細を表示する機能を提供する場合、ビジネスロジックからその情報をJSPに共有する必要があります。
サーブレットからJSPに情報を共有するには、次のようにします。
1. サーブレットのサービスメソッドに渡される第1引数(HttpServletRequestのインスタンス)に「属性」を保存する。
HttpServletRequest.setAttributeメソッドの第1引数に属性名、第2引数に属性値を渡して呼び出すと、属性名と属性値がペアとなって、当該リクエストに紐づく形で保持されます。
2. JSPに処理を回す。
3. JSPのスクリプトレットや式出力で「属性」を読み込む。
スクリプトレットでrequest.getAttributeを呼び出すことで、元のサーブレットのサービスメソッドに渡されたリクエストに紐付いた「属性」の属性値を読み込むことができます。
一番楽そうな方法
GETメソッド用のサーブレットとPOSTメソッド用のサーブレットを分ける。
GETメソッド用のサーブレットでは、パラメータで指定されたメッセージを表示できるようにする。
HttpServletRequest.setAttributeなどを利用する。
POSTメソッド用のサーブレットでは、GETメソッド用のサーブレットに対応したURLにパラメータを付してリダイレクトする。
参考にした資料